#include <memory>
#include <vector>
#include <iostream>
using namespace std;


void test(){
    shared_ptr<int> sp(new int(1));
    cout << *sp << endl; // 获取值
    cout << sp.get() << endl;// 获取地址
    cout << sp.use_count() << endl; // 获取引用个数
    // 使用拷贝构造尝试是否可以实现
    shared_ptr<int> sp1 = sp;
    cout << sp1.get() << endl;// 获取地址
    cout << sp.use_count() << endl; // 获取引用个数
    cout << sp1.use_count() << endl; // 获取引用个数

    // 尝试赋值运算符函数
    shared_ptr<int> sp3(new int(2));
    sp3 = sp;
    cout << sp3.get() << endl;// 获取地址
    cout << sp.use_count() << endl; // 获取引用个数
    cout << sp3.use_count() << endl; // 获取引用个数
    cout << sp1.use_count() << endl; // 获取引用个数

}

void test1(){
    // 验证shared_ptr是否可以当做传入给vector
    vector<shared_ptr<int>> vec;
    shared_ptr<int> sp1(new int(1));
    // 查看此时shared_ptr指向堆空间的引用计数
    cout << sp1.use_count() << endl;
    vec.push_back(sp1);
    cout << sp1.use_count() << endl;
    vec.push_back(shared_ptr<int>(new int(2)));
    shared_ptr<int> sp2(new int(1));
    cout << sp2.use_count() << endl;
    // 新建一个sp2看看如果对于右值
    // 是调用移动语义还是复制
    vec.push_back(std::move(sp2));
    // 调用之后插看对于sp2之前管理
    // 的堆空间的应用计数
    cout << sp2.use_count() << endl;
    
// 说明如果是左值的话在shared_ptr
// 的资源设置引用之下，不会进行复制（拷贝）
// 只是通过增加引用计数的值来添加操作他的对象
// 而如果使用右值的shared_ptr资源
// 会将该临时的堆空间通过移动语义
// 进行资源的转移使用，节省了空间和复制操作的时间
//
}

int main(int atgc, char * argv[])
{
    test1();
    return 0;
}

